package com.example.project.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.example.project.action.ActionUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BeanUtil {
    private static Logger logger = LoggerFactory.getLogger(BeanUtil.class);
    private BeanUtil() {
        throw new IllegalStateException("Utility class");
    }
    /**
     * 将Json数组格式的字符串转换成List集合
     * @param bean
     * @return
     */
    public static <T> String beanToJson(T bean){
        return JSON.toJSONString(bean, SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullNumberAsZero);
    }

    /**
     * 将Json数组格式的字符串转换成List集合
     * @param bean 业务实体
     * @param isShowEmptyField 是否显示空值的字段
     * @return
     */
    public static <T> String beanToJson(T bean, boolean isShowEmptyField){
        if (isShowEmptyField)
            return JSON.toJSONString(bean, SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullNumberAsZero);
        return JSON.toJSONString(bean);
    }

    /**
     * 将Json数组格式的字符串转换成List集合
     * @param jsonStr
     * @param clazz
     * @return
     */
    public static <T> List<T> jsonToList(String jsonStr, Class<T> clazz){
        List<T> list = new ArrayList<>();
        if (StringUtil.isEmpty(jsonStr))
            return list;
        return JSONArray.parseArray(jsonStr,clazz);
    }

    /**
     * 将List数据集转换成json格式数组
     * @param list
     * @param isShowEmptyField 是否显示空值的字段
     * @return
     */
    public static String listToJson(List<?> list, boolean isShowEmptyField){
        if (isShowEmptyField)
            return JSON.toJSONString(list,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullNumberAsZero);
        return  JSON.toJSONString(list);
    }

    /**
     * 将Json数组格式的字符串转换成Map集合
     * @param jsonStr
     * @return
     */
    public static Map<String,Object> jsonToMap(String jsonStr){
        Map<String,Object> map = new HashMap<>();
        if (StringUtil.isEmpty(jsonStr))
            return map;
        return JSONObject.parseObject(jsonStr);
    }

    /**
     * 将List数据集转换成json格式数组
     * @param list
     * @return
     */
    public static String listToJson(List<?> list){
        return JSON.toJSONString(list,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteNullNumberAsZero);
    }


    /**
     * 将Map转换成javaBean，返回需要的实体对象
     * @param map 待转换的Map
     * @param clazz 需要转换的实体类
     * @author chenth
     */
    public static <T> T formatMapToBean(Map<?, ?> map, Class<T> clazz){
        return JSON.parseObject(JSON.toJSONBytes(map),clazz);
    }

    /**
     * 将Map转换成javaBean，返回需要的实体对象
     * @param clazz 需要转换的实体类
     * @author chenth
     */
    public static <T> T formatJsonToBean(String jsonString, Class<T> clazz){
        return JSON.parseObject(jsonString,clazz);
    }


    /**
     * 将传来的参数转换成javaBean，返回需要的实体对象
     * @param clazz 需要转换的实体类
     * @author chenth
     */
    public static <T> T formatToBean(Class<T> clazz){
        return formatMapToBean(ActionUtil.getParameterMap(),clazz);
    }
}
